package logica;

import java.awt.Point;
import java.awt.geom.Point2D;

/**
 * Deze klasse stelt een bepaald obstakel voor.
 * <p>
 * Zowel de wanden van de zee als obstakels in het water zijn objecten van de
 * klasse Obstakel.
 *
 * @author Bart Bruynooghe
 * @author Benjamin De Clercq
 * @author Thomas Flamant
 * @author Sander Van den Broecke
 */
public class Obstakel implements IGebied {

	// dataleden
	private Point2D.Double rasterPositie;
	private Point2D.Double middelPunt;

	/**
	 * Deze methode bepaalt de relatieve positie van een punt ten
	 * opzichte van het huidige obstakel.
	 * <p>
	 * @param p het punt tot welk je de relatieve positie wil berekenen.
	 * @return al naar gelang waar je je bevindt ten opzichte van het obstakel: noord, zuid, west of oost.
	 */
	public String getRelatievePositie(Point p) {
		double noord = (rasterPositie.y + 1) * Constanten.ZIJDEGEBIED;
		double zuid = (rasterPositie.y + 2) * Constanten.ZIJDEGEBIED;
		double west = (rasterPositie.x + 1) * Constanten.ZIJDEGEBIED;
		if (p.y < noord) {
			return "noord";
		} else if (p.y > zuid) {
			return "zuid";
		} else if (p.x < west) {
			return "west";
		} else {
			return "oost";
		}
	}

	// constructor
	/**
	 * De constructor van Obstakel initialiseert het attribuut rasterPositie
	 * @param  rasterPositie  dit attribuut stelt de x- en y-component van het obstakel voor
	 */
	public Obstakel(Point2D.Double rasterPositie) {
		this.rasterPositie = rasterPositie;
		middelPunt = new Point2D.Double(rasterPositie.x * Constanten.ZIJDEGEBIED + Constanten.ZIJDEGEBIED / 2,
				rasterPositie.y * Constanten.ZIJDEGEBIED + Constanten.ZIJDEGEBIED / 2);
	}

	// methodes
	/**
	 * Deze methode geeft de afstand terug van een bepaald punt tot aan het
	 * huidige obstakel.
	 * @param p het punt tot waar je de afstand wil berekenen
	 * @return de afstand tot het punt
	 */
	public int getAfstand(Point2D.Double p) {
		return (int) middelPunt.distance(p);
	}

	public Point2D.Double getMiddelPunt() {
		return middelPunt;
	}
}
